package twelfth.压缩流.解压缩;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

/**
 * ZipInputStream类是InputStream类的子类，通过此类，可以方便的读取ZIP格式的压缩文件
 * 常用方法：
 * ZipInputStream(InputStream in):实例化ZipInputStream对象
 * ZipEntry getEntry()：取得下一个ZipEntry
 */
public class ZipInputStream类 {
    public static void main(String[] args) throws IOException {
        // 如何获取压缩文件的ZipEntry
        /*
        File zipfile = new File("D:\\WorkSpaces\\JavaDevelopBase_start_329\\src\\twelfth\\fakeDir.zip");
        ZipInputStream zipis = new ZipInputStream(new FileInputStream(zipfile));
        ZipEntry entry = zipis.getNextEntry();//得到zip文件中的一个压缩实体
        System.out.println("压缩实体名称："+entry.getName());
        zipis.close();//关闭压缩输入流
        */
        // 解压缩zip文件
        /**
         * 在fakeDir.zip文件夹中本身是包含压缩文件的，所以在解压缩之前，应该先根据ZIP文件中的文件夹名称在硬盘上创建一个对应的文件夹，然后才能把
         * 文件解压缩过去，而且在操作时 对于每一个解压缩的文件都必须先创建后再输出（File类的createNewFile()方法可以创建新文件）
         */
        // zip文件
        File file = new File("D:\\WorkSpaces\\JavaDevelopBase_start_329\\src\\twelfth\\fakeDir.zip");
        File outfile = null;// 输出文件
        ZipFile zipFile = new ZipFile(file);
        ZipInputStream zipis = new ZipInputStream(new FileInputStream(file));
        ZipEntry entry = null;
        InputStream is = null;
        OutputStream os = null;
        long start = System.currentTimeMillis();
        while ((entry = zipis.getNextEntry()) != null) {
            System.out.println("解压缩" + entry.getName() + "文件");
            outfile = new File("D:\\WorkSpaces\\JavaDevelopBase_start_329\\src\\twelfth\\" + entry.getName());// 实例化输出文件
            if (!outfile.getParentFile().exists()) {
                outfile.getParentFile().mkdir();// 如果父文件不存在的话 创建目录
            }
            if (!outfile.exists()) {
                outfile.createNewFile();// 如果目录不存在的话
            }
            is = zipFile.getInputStream(entry);
            os = new FileOutputStream(outfile);
            int temp =0;
            while((temp=is.read())!=-1){//花费时间是：77818
                os.write(temp);
            }
           /* int temp = 0;
            byte data[] = new byte[1024];
            while ((temp = is.read(data)) != -1) {  //花费时间203
                os.write(data, 0, temp);
            }*/
        }
        long end = System.currentTimeMillis();
        long time = end - start;
        System.out.println("花费时间是：" + time);
        is.close();
        os.close();
    }
}
